package euler.p001_050;

import euler.MainEuler;

public class Euler027 extends MainEuler {

    /*
        Euler published the remarkable quadratic formula:

        n² + n + 41

        It turns out that the formula will produce 40 primes
        for the consecutive values n = 0 to 39.
        However,
        when n = 40, 402 + 40 + 41 = 40(40 + 1) + 41
        is divisible by 41,
        and certainly when n = 41, 41² + 41 + 41
        is clearly divisible by 41.

        Using computers, the incredible formula
        n² − 79n + 1601 was discovered, which produces 80
        primes for the consecutive values n = 0 to 79.
        The product of the coefficients,
        −79 and 1601, is −126479.

        Considering quadratics of the form:

            n² + an + b, where |a| < 1000 and |b| < 1000

            where |n| is the modulus/absolute value of n
            e.g. |11| = 11 and |−4| = 4

        Find the product of the coefficients, a and b,
        for the quadratic expression that produces
        the maximum number of primes for consecutive
        values of n, starting with n = 0.

     */

    public String resolve() {

        int maxVA = 1000;

        int maxCantPrimos = 0;
        int maxA = 0;
        int maxB = 0;

        for (int a = -maxVA+1; a < maxVA; a++) {
            for (int b = 2; b < maxVA; b++) {
                int cantPrimos = 0;

                if (primeHelper.isPrime(b)) {
                    for (int n = 1; n < Integer.MAX_VALUE; n++) {
                        int p = n*n + a*n + b;

                        if (p > 1 && primeHelper.isPrime(p)) {
                            cantPrimos++;
                        } else {
                            break;
                        }
                    }
                }

                if (cantPrimos > maxCantPrimos) {
                    maxA = a;
                    maxB = b;
                    maxCantPrimos = cantPrimos;
                }
            }
        }

        return String.valueOf(maxA*maxB);
    }

}
